Tout programmeur en basic se pose la question de la "3D" ...qui sonne si mystérieusement et délicieusement à l'oreille de tout accro du monde virtuel.
Je propose ici une approche d'une methode de rendu d'objets en 3D. Si vous etes un programmeur courageux et ambitieux passez votre chemin, regardez mes progs Util 3D et graph 3D sans regarder le code et cherchez vous meme
Je vais enployer la méthode du drawstat, pensez à regarder le tutorial dédié à cette technique si vous n'etes pas au point .
On va travailler sur un objet simple : un cube de 2 unités de coté centré sur l'origine.
Notez que pour avoir un beau cube avec tous ses aretes en drawstat il faut repasser par certains pouints d'ou le nombre de points.
Ici List 1 = X List 2 = Y et List 3 = Z
Nous allons partir du principe que pour afficher le cube en 3D il suffit de retenir ses coordonnées en X et Y. Donc essayons d'afficher notre cube :
//paramétrez le s-graph 1 pour le drawstat en xyLine et Dot
S-WindMan // pour que nous puissions imposer la fenetre
View-Window -4,4,0,-2,2,0 // on peux prendre cette fenetre pour l'exemple car avec le coté du cube est de longueur 2
Drawstat
Et là on obtient :
On dirait un carré et pas un cube car on n'a pas ajouté d'effet de fuite. On fera ça plus tard, pour le moment on va faire tourner le cube sur lui meme
On a les coordonnées cartésiennes des points du cube mais on va utiliser les coordonnées polaires pour la démonstration de la formule que j'ai utilisé qui est sans doute la plus rapide et la plus simple.
On va faire tourner le cube selon le plan x-y puis y-z puis x-z donc en fait à chaque fois on est ramené à une rotation simple dans un plan tel que vous en connaissez depuis la seconde (au moins).
Regardez l'image suivante pour mieux comprendre ce qui suit :
Le point initial M fait un angle µ avec l'axe des abscisses et est à une distance r de O.
M' le point image apres la rotation est également à une distance r mais fait un angle µ+µ' avec l'axe des abscisses où µ' est l'angle de rotation.
On donc en coordonnées polaires : M(r;µ) M'(r,µ+µ') et en coordonnées cartésiennes M(x,y) et M'(x',y')
On a :
x = r*cos µ x' = r*cos (µ+µ')
y = r*sin µ y' = r*sin (µ+µ')
J'imagine que vous connaissez tous tres bien vos formules de trigo donc je ne vous rappelle pas que
cos (a+b) = cos a*cos b - sin a*sin b
sin (a+b) = sin a*cos b + sin b*cos a
Et voila ! on a une magnifique formule en fonction de x, y et µ' l'angle de rotation!!!!
Simple et extremement rapide! car il suffit de 2 calculs par rotation!
J'ai mis beaucoup beaucoup de temps pour trouver ceci meme si la formule parait simple une fois ecrite il faut y penser...
Voila, je ne vous fais pas le code, je vous laisse gratter un peu quand meme et au passage vous venez de lire en 2 min ce que j'ai cherché pendant des mois...1 an je pense .... (car MOI je voulais faire tout seul )
Code d'exemple :
ClrGraph
{1,1,-1,-1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,1}List 1
{-1,1,1,-1,-1,-1,1,1,1,1,1,1,-1,-1,-1,-1}List 2
{-1,-1,-1,-1,-1,1,1,-1,1,1,-1,1,1,-1,1,1}List 3
S-Grph1 DrawOn,xyLine,List1,List2,1,Dot
0A~C
Do
"A"?A
"B"?B
"C"?C
Cls
Text 1,1,"Calcul."
List 1 * cos A - List 2 * sin A List 4
List 1 * sin A + List 2 * cos A List 2
List 4List 1
Text 1,30,"."
List 2 * cos B - List 3 * sin B List 4
List 2 * sin B + List 3 * cos B List 3
List 4List 2
Text 1,34,"."
List 1 * cos C - List 3 * sin C List 4
List 1 * sin C + List 3 * cos C List 3
List 4List 1
Cls
Drawstat
Lpwhile 1=1
A mon avis ce n'est pas possible de faire des jeux en vrai 3D (avec des lunettes 3D) sur la prizm (au niveau de lenteur) car sur un ordinateur par exemple un jeu en vrai 3D avec lunette est deux voir même trois fois plus lent que le même jeu en 3D sans lunette
----------------------------------
L1 Math-Informatique à l'université Paul-Verlaine (Metz)
Purobaz Hors ligne Membre Niveau: Aucun
Points: 2166
Défis: 108 Email | Message
Doit y avoir des astuces pour contourner le problème.
A mon avis, dans le jeu cité plus haut, tous les éléments du décor ne sont pas en 3D.
Ça dépend aussi du type de jeu.
De plus les calculs pour rajouter la 3D ne sont pas très longs et compliqués. Il faut juste décaler la deuxième image en fonction de la profondeur.
De plus les calculs pour rajouter la 3D ne sont pas très longs et compliqués. Il faut juste décaler la deuxième image en fonction de la profondeur.
Mais le problème vient au niveau de la superposition des deux images, je pense que c'est surtout ça qui fait ralentir des programmes en 3D, il y a aussi un peu de transparence (exemple: Lien, le vert est un peu transparent) du coup je pense qu'il faut modifier les valeurs RVB de presque tous les pixels de la première image en fonction de la couleur des pixels de la deuxième image.
Mais c'est possible que je me trompe.
Doit y avoir des astuces pour contourner le problème.
Utiliser des sprites qui sont déjà en 3D de base?
----------------------------------
L1 Math-Informatique à l'université Paul-Verlaine (Metz)
Après peut-être qu'il faut se limiter au noir et blanc du coup... mais les calculs n'ont jamais tué personne...
Le projet ( encore secret ) que je suis en train de mener m'en demande pas mal...
----------------------------------
Dieu créa l'homme, l'homme créa la calculatrice... Qui est le prochain ? 42
Kristaba Hors ligne Membre Niveau: Vétéran
Points: 585
Défis: 22 Email | Message
Comme je vois que pas mal de monde est intéressé par le rendu 3D en ce moment, je vous met à disposition une mini lib bien pratiques dans ce genre de domaine.
Il s'agit de fonctions de manipulation de nombres à virgule fixe.
En gros, comme notre CPU ne dispose pas d'un FPU (instructions dédiées à un traitement rapide des nombres à virgule flottante), dès qu'on utilise des float/double en C, le temps de calcul est largement supérieur à une utilisation d'entiers.
Les "fixed" permettent de faire un compromis entre performances et précision, en utilisant des entiers de 32 bits qui sont alors utilisés comme des nombres réels, mais contrairement aux float, la position de la virgule est fixe (définie à la compilation), ce qui empêche la représentation de très grands nombres ou de très petites fractions, mais permet de simplifier énormément les instructions nécessaires aux calculs.
De plus, une table pré-calculée (avec un pas de 0.1°) permet d'obtenir de meilleurs perfs pour les opérations trigonométriques (sin cos tan), très utilisées dans les calculs en 3D.
Bon, c'est pas hyper bien documenté, mais rapidement :
Dans fixed.h, on trouve un
#define DB 15
On peut changer cette valeur pour changer la position de la virgule dans le nombre binaire (entre 0 -pas de partie fractionnaire- et 31 -pas de partie entière-) sachant que les entiers sont signés, donc 1 bit pour le signe.
Pour donner un ordre de grandeur, avec 15 bits de partie fractionnaire (donc 16 pour la partie entière et 1 bit de signe), on a les valeurs min/max autour de +/- 65000, et un pas d'environs 0.00003
Parmi les fonctions disponibles, il y a
FIX() / UNFIX(), pour convertir un entier vers un fixed ou un fixed vers un entier
fixtostr() pour écrire la valeur d'un fixed dans une chaine
ftofix() / fixtof() pour convertir un flottant vers un fixed et inversement (pour utiliser des fonctions mathématiques de la lib std C par exemple)
fdiv(), fmul() pour diviser/multiplier des fixed entre eux
fsin(), fcos(), ftan() pour la trigo
Pour les additions/soustractions, il suffit d'utiliser le "+" habituel (une addition de fixed se fait en un seul cycle du processeur)
Ah, oui, le code est écrit pour GCC, il y a peut-être des retouches à faire pour passer sous le compilo de Renesas, mais ça devrait pas être trop compliqué.
Pour les opérations style racine carrée et compagnie, je n'ai pas écrit de fonction pour cela, il faut donc convertir le fixed en flottant et utiliser les fonctions de math.h (le tout étant coûteux en temps CPU :x)
Pour finir là dessus, il se trouve que ce genre de nombres est assez bien adapté au monde de la 3D car les échelles de grandeur manipulées sont généralement assez proche, ce qui n'est pas forcément le cas dans nombre d'autres applications (pour lesquels les float restent indispensables).
----------------------------------
Une bataille navale avec Intelligence Artificielle sur Graph 35? C'est ICI !
Projets en cours :
*CGUI++, Une GUI C++ multi-plateforme conçue pour fonctionner sur calculatrices.
*Tiles Creator, un environnement de création et gestion de ressources graphiques.
Je suppose que t'avais créé ça dans le but de faire quelque-chose en 3D, non ?
Si oui, t'as fait quoi ? Je crois me rappeler que Pierrot m'avais parlé d'un p'tit moteur d'affichage 3D avec je sais plus combien de cubes, à je sais plus combien d'FPS (ça remonte trop pour que je me souvienne). Mais connaissant tes qualités de programmeur, je suppose que tu étais arrivé à un résultat intéressant non ?
tu veux un cours particulier? et en quel langage? si tu veux mon aide, tu peux m'envoyer un message, je tenterais de t'aider (mais si l'astuce est conne est simple (mathématiques niveau 2onde ou 1ère) l'utilisation peut parfois être ardue).
----------------------------------
Mes programmes
masquer
-en Basique:PICFMLIM
(permet de convertir pict 1 en code stat sur f-mem)[/spoiler2]
Vous avez vu ma news sur la 3D ? Dedans il y avait un lien dans lequel vous trouvez comment faire de la 3D pleine ou filaire avec même placage de texture !
Ca pourrait aider pour ton Blender Dark storm.
----------------------------------
Dieu créa l'homme, l'homme créa la calculatrice... Qui est le prochain ? 42
ok, je ferais un tuto simple comme bonjour si possible, pour les figures convexes (cube) et concaves (plusieurs angles de différentes tailles, ou une série de cube par exemple)
l'une des techniques consiste a utiliser l'angle de rotation du cube, et l'autre la normale des faces du cube (plus dur et plus long, essentiellement pour le C si il y a plusieurs formes géométriques)
Ajouté le 31/05/2012 à 00:29 :
tenez: lien
j'ai fait viteuf un petit tuto sur l'occlusion de face, si sa vous intéresse
----------------------------------
Mes programmes
masquer
-en Basique:PICFMLIM
(permet de convertir pict 1 en code stat sur f-mem)[/spoiler2]
Planète-Casio est un site communautaire indépendant et n'est donc pas affilié à Casio | Toute reproduction de Planète-Casio, même partielle, est interdite
Les fichiers, programmes et publications postés sur Planète-Casio restent la propriété de leurs auteurs respectifs et peuvent être soumis à des copyrights
Merci de respecter le travail des autres ! | CASIO est une marque déposée par CASIO Computer Co., Ltd